package com.sanyue.mySpringBoot;

import com.sanyue.mySpringBoot.config.MyConfig;
import org.springframework.cglib.proxy.Dispatcher;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

/**
 * @author: Guan
 * 初始化器——完成容器的初始化
 *  解读：
 *   1.创建我们的Spring容器
 *   2.容器的功能：加载/关联Spring容器的配置-按照注解的方式
 *                完成Spring容器bean的配置，依赖注入
 *   3.创建前端控制器DispatcherServlet,并让其持有spring容器（接收容器信息，完成分发映射）
 *   4.注意：这里的onStartup方法有Tomcat调用，并把ServletContext对象传入，
 *           用来将一些信息传入ServletContext对象中，让Tomcat接收/捕获
 **/

public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println("startup----");
        //加载容器，我们自己写过MySpringApplicationContext
        AnnotationConfigWebApplicationContext ac
                = new AnnotationConfigWebApplicationContext();

        //在ac容器中注入MyConfig配置类
        ac.register(MyConfig.class);
        //完成bean的创建和配置
        ac.refresh();

        //创建非常重要的前端控制器——DispatcherServlet
        //让DispatcherServlet持有容器
        //这样就可以进行映射分发
        DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);

        //将前端控制器放入到servletContext对象中，这样Tomcat就可以接收（捕获）到DispatcherServlet
        //返回一个registration对象（注册）
        ServletRegistration.Dynamic registration
                = servletContext.addServlet("app", dispatcherServlet);
        //在Tomcat启动时，就加载dispatcherServlet
        //java web中配置web.xml中讲过启动时间和映射地址
        registration.setLoadOnStartup(1);
        //拦截请求，并进行分发处理
        //当配置为/时，会覆盖tomcat的DefaultServlet，当其他的url-pattern都不匹配的时候，就会走到这个Servlet
        registration.addMapping("/");

    }
}
